Pular para o conteúdo

[Duvida] Uso de ponteiro funcionando quando não deveria. [RESOLVIDO]

Responder tópico
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
  • Denunciar
  • Indicar

1. [Duvida] Uso de ponteiro funcionando quando não deveria. [RESOLVIDO]

Enviado em 24/12/2010 - 15:09h

olá pessoal, tenho um codigo aqui fazendo testes com ponteiro, fiz uma coisa que não deveria pelo que aprendi sobre ponteiros...porem o codigo funciona, ainda sim, acredito estar fazendo mau uso, e gostaria de saber as implicações disso.Segue o codigo bem simples:

int *c;// declara o dito
c = (int *)malloc(sizeof(int));// reserva espaco de memoria para a variavel
*c = 10;// atribui valor onde o ponteiro aponta...ok
printf("%i\n",*c);// exibe o valor...ok
c++;// obs 1
*c = 20;// obs 2
printf("%i\n",*c);
c++;
*c = 30;
printf("%i\n",*c);
printf("Voltando...\n");
printf("%i\n",*c);
c--;
printf("%i\n",*c);
c--;
printf("%i\n",*c);
// fim

obs 1: pelo que aprendi, fazer c++ quando c é um ponteiro, incrementa sua localização,ou seja
se c apontava para um endereco 162066464, sera somado o tamanho de um int, e ele passara a apontar para 162066468.

obs 2:até ai tudo bem, o problema e que eu atribui um valor para este endereço de memoria sem ter declarado antes, isso não deveria dar um "access violation" ou qualquer coisa do tipo,já que estou a usar um endereço que não foi previamente requisitado?

neste exemplo tanto o encremento quanto o decremento funcionaram perfeitamente exibindo os valores corretos...

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

2. Alocação de memória

Melhor resposta

Enviado em 25/12/2010 - 13:29h

Oi Alex,

A sua questão é pertinente. Na vida real, o que acontece em nível máquina é muito mais complexo do que aquilo abordado em livros de programação.

A alocação de memória não é tão simples como reservar 4 bytes de memória para um inteiro e seguir adiante, isso é algo que depende fortemente da arquitetura da CPU. Ainda em um tom bem superficial, saiba que geralmente (para não dizer sempre) os blocos de memória são maiores do que o necessário.

Falhas de segmentação ocorrem ao acessar memória não reservada: Faça você mesmo o teste para imprimir os endereços de apontamento e notará que a sua primeira observação está certa. Substitua "c++;" por "c = c + 1000;" e a famigerada messagem "Segmention fault" provavelmente irá aparecer.

Abraço!

3. Re: [Duvida] Uso de ponteiro funcionando quando não deveria. [RESOLVIDO]

Enviado em 24/12/2010 - 17:29h

Olá,

Bom, tu alocar uma região e usar além da conta o C, pode até permitir, mas não foi à área previamente alocado, você está invadindo uma área que não foi destinada aquilo. Ser possível não significa ser o ideal, ou uma boa prática.

Abraços e Boas Festas

4. ponteiros são perigosos

Enviado em 25/12/2010 - 14:06h

f_Candido:

Eu estava quase caindo na besteira de achar isto "normal", como meio de burlar a parte chata de alocação de memoria ^^

julio_hoffimann:

hum,estes blocos de memorial maiores que o necessario me fazem pensar em duas coisas:

1 - a importancia de usar free, já que alem de liberar a memoria que foi utilizada, deve liberar esta parte "extra" do bloco certo?

2 - o problema de se esbajar memoria nos programas, ja que quando aloco variaveis atoa,(tipo um long pra guardar um numero de telefone), alem da memoria esperada, ainda de quebra se aloca um pedaço mais inutil ainda.

não que eu use realmente um long pra isso, mas com os pcs cada vez mas [*****]ços de hoje, não duvido nada que alguns programadores não estão nem ai pra estes detalhes.

Outro problema, neste caso o "Segmention fault" ocorre quando realmente estrapolamos, mas errinhos as vezes imperceptives como o caso do c++, passa batido,e deve dar mô dor de cabeça pra achar,principalmente para programadores inesperientes como é o meu caso...

Por essas e outras que digo: ponteiros são perigosos...mas são bem legais ^^

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Responder tópico

Entre na sua conta para responder.

Fazer login para responder